Amazon Linux 2 に Xilinx Video SDK をインストールしてトランスコードを実行してみた
こんにちは、大前です。
先日 EC2 の新しいインスタンスファミリーについてご紹介しました。
上記記事では Xilinx Video SDK AMI を利用して VT1 インスタンスを立ててみましたが、Amazon Linux 2 などの既存 AMI にも Xilinx Video SDK をインストールして利用できるみたいですので、今回はこれを試してみます。
やってみた
Amazon Linux 2 で VT1 インスタンスの起動
VT1 インスタンスを新規に起動します。前回は Xilinx Video SDK AMI を選択しましたが、今回は最新の Amazon Linux 2 AMI を選択します。
インスタンスタイプは vt1.3xlarge を選択します。残りの設定は特筆するものはないため省略しますが、動画ファイルを扱うので、ストレージだけ少し増やしました。
Xilinx Video SDK インストール
立ち上がっった EC2 にログインし、Xilinx Video SDK のインストールを進めます。インストールの手順は、下記の公式ドキュメントを参考にしました。
# パッケージのインストール $ sudo amazon-linux-extras install epel -y $ sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r) boost-devel gcc-c++ -y # git インストール $ sudo yum install git -y # Xilinx Video SDK のダウンロード $ git clone https://github.com/Xilinx/video-sdk $ ls video-sdk # ディレクトリ移動し、インストールの実行 $ cd ./video-sdk/release/U30_Amazon_2.0_v1.5_20210827/ $ ./install.sh -sw Successfully wrote (76861 bytes) to the output file: /opt/xilinx/xcdr/xclbins/transcode.xclbin Leaving xclbinutil. # Xilinx Video SDK を利用するためのセットアップスクリプト実行 $ source /opt/xilinx/xcdr/setup.sh $ echo $PATH /opt/xilinx/ffmpeg/bin:/opt/xilinx/xcdr/bin:/opt/xilinx/launcher/bin:/opt/xilinx/jobSlotReservation/bin:/opt/xilinx/xrm/bin:/opt/xilinx/xrt/bin:/sbin:/bin:/usr/sbin:/usr/bin
Xilinx Video SDK のサンプルスクリプトを動かしてみる
無事に Xilinx Video SDK がインストールできたら、実際に Xilinx Video SDK を利用した処理を体験してみたいと思います。
/PATH/video-sdk/examples/ffmpeg/tutorials 配下にサンプルスクリプトが入っているので、今回はこれを利用して Xilinx Video SDK を叩いてみます。
$ cd video-sdk/ $ ls examples/ffmpeg/tutorials 01_ffmpeg_decode_only.sh 06_ffmpeg_transcode_plus_scale.sh 11_ffmpeg_ftrt_transcode_only.sh 02_ffmpeg_encode_only_1080p.sh 07_ffmpeg_transcode_plus_scale_lowlatency.sh 12_ffmpeg_streaming_transcode_from_file.sh 03_ffmpeg_transcode_only.sh 08_ffmpeg_encode_only_4k.sh 13_ffmpeg_transcode_only_split_stitch.py 04_ffmpeg_decode_plus_scale.sh 09_ffmpeg_transcode_only_4k.sh 05_ffmpeg_encode_plus_scale_1080p.sh 10_ffmpeg_multiple_jobs.sh
上記のサンプルスクリプトのうち、入力ファイルを 8Mbps の H.264 ファイルにエンコードするスクリプト(03_ffmpeg_transcode_only.sh)を実行します。
トランスコードにどのくらい時間を要するか確認したいので、スクリプト内の ffmpeg コマンド前後に date を追加しておきます。
(中略) date ffmpeg -c:v mpsoc_vcu_h264 -i $1 \ -f mp4 -b:v 8M -c:v mpsoc_vcu_h264 -y /tmp/xil_xcode.mp4 date
入力となるファイルとしては、Big Buck Bunny を利用しました。また、Xilinx Video SDK のチュートリアル内の記載に従い、入力ファイルは /dev/shm 配下に配置しています。
$ cd video-sdk/examples/ffmpeg/tutorials $ ./03_ffmpeg_transcode_only_with_time.sh /dev/shm/bbb_sunflower_1080p_60fps_normal.mp4 Wed Oct 20 10:52:41 UTC 2021 (中略) frame=38072 fps= 90 q=-0.0 Lsize= 635709kB time=00:10:34.50 bitrate=8207.6kbits/s speed= 1.5x video:604269kB audio:30544kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.141124% [aac @ 0x829f40] Qavg: 191.192 Wed Oct 20 10:59:44 UTC 2021
約 7分ほどでトランスコードが完了しました。
元ファイルの情報は以下です。4Mbps/H.264/1080p の約 10分の動画です。
変換後の動画ファイルは以下です。解像度やコーデックはそのままに 8Mbps に変換されている事がわかります。
比較の為に、Xilinx Video SDK を使わない形で同様のトランスコードを FFmpeg で実施してみます。基本的には上記 03_ffmpeg_transcode_only.sh 内のコマンドを踏襲しつつ、ビデオコーデックの指定のみ libx264 に差し替えて実行します。vt1.3xlarge インスタンスを別にもう一つ作成し、そこで実行しています。
date ffmpeg -i $1 -c:v libx264 -f mp4 -b:v 8M -y /tmp/xil_xcode_without_u30.mp4 date
実行結果
$ ./xil_xcode_without_u30.sh /dev/shm/bbb_sunflower_1080p_60fps_normal.mp4 Wed Oct 20 10:55:42 UTC 2021 (中略) [aac @ 0x5c88f80] Qavg: 191.172 Wed Oct 20 11:03:33 UTC 2021
約 8分でトランスコードが完了しました。あくまで同じ様な出力を生成するコマンドなので単純比較は出来ませんが、Xilinx Video SDK を利用するよりも時間がかかってそうです。
もっと重い処理で比較すれば Xilinx Video SDK 使用時の方が実行時間が短くなるのでは?と思い、1つの入力から 5つの出力を生成するサンプルスクリプト 06_ffmpeg_transcode_plus_scale.sh で比較してみます。
上記と同様に、FFmpeg コマンドの前後に date を挟んだスクリプトを用意します。
(中略) date ffmpeg -c:v mpsoc_vcu_h264 -i $1 \ -filter_complex "multiscale_xma=outputs=4: \ out_1_width=1280: out_1_height=720: out_1_rate=full: \ out_2_width=848: out_2_height=480: out_2_rate=half: \ out_3_width=640: out_3_height=360: out_3_rate=half: \ out_4_width=288: out_4_height=160: out_4_rate=half \ [a][b][d]; [a]split[aa][ab]; [ab]fps=30[abb]" \ -map "[aa]" -b:v 4M -c:v mpsoc_vcu_h264 -f mp4 -y /tmp/xil_xcode_scale_720p60.mp4 \ -map "[abb]" -b:v 3M -c:v mpsoc_vcu_h264 -f mp4 -y /tmp/xil_xcode_scale_720p30.mp4 \ -map "[b]" -b:v 2500K -c:v mpsoc_vcu_h264 -f mp4 -y /tmp/xil_xcode_scale_480p30.mp4 \ -map "" -b:v 1250K -c:v mpsoc_vcu_h264 -f mp4 -y /tmp/xil_xcode_scale_360p30.mp4 \ -map "[d]" -b:v 625K -c:v mpsoc_vcu_h264 -f mp4 -y /tmp/xil_xcode_scale_288p30.mp4 date (中略)
実行結果
$ ./06_ffmpeg_transcode_plus_scale_with_time.sh /dev/shm/bbb_sunflower_1080p_60fps_normal.mp4 Thu Oct 21 01:52:10 UTC 2021 (中略) frame=38072 fps= 98 q=-0.0 Lq=-0.0 q=-0.0 q=-0.0 q=-0.0 size= 303626kB time=00:10:34.50 bitrate=3920.1kbits/s speed=1.64x video:852995kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown Thu Oct 21 01:58:39 UTC 2021
約6分で完了しました。
こちらも同様に、Xilinx Video SDK を使わない形で同様のトランスコードを FFmpeg で実施してみます。基本的には上記 06_ffmpeg_transcode_plus_scal.sh 内のコマンドを踏襲しつつ、ビデオコーデックの指定のみ libx264 に差し替えて実行します。
date ffmpeg -i $1 \ -filter:v scale=-2:720 -c:v libx264 -b:v 4M /tmp/xil_xcode_without_u30_scale_720p60.mp4 \ -filter:v scale=-2:720 -c:v libx264 -b:v 3M -r 30 /tmp/xil_xcode_without_u30_scale_720p30.mp4 \ -filter:v scale=-2:480 -c:v libx264 -b:v 2500K -r 30 /tmp/xil_xcode_without_u30_scale_480p30.mp4 \ -filter:v scale=-2:360 -c:v libx264 -b:v 1250K -r 30 /tmp/xil_xcode_without_u30_scale_360p30.mp4 \ -filter:v scale=-2:160 -c:v libx264 -b:v 625K -r 30 /tmp/xil_xcode_without_u30_scale_288p30.mp4 date
実行結果
$ ./xil_xcode_plus_scale_without_u30.sh /dev/shm/bbb_sunflower_1080p_60fps_normal.mp4 Thu Oct 21 01:52:46 UTC 2021 [aac @ 0x5b6fe40] Qavg: 191.172 Thu Oct 21 02:04:54 UTC 2021
約12分で完了しました。あくまで同じ様な出力を生成するコマンドで検証しているので単純比較は出来ないですが、Xilinx Video SDK のパフォーマンスの高さを実感する事は出来たかと思います。
おわりに
Amazon Linux 2 に Xilinx Video SDK をインストールしてトランスコードを試してみました。また、Xilinx Video SDK を使わない FFmpeg コマンドでも類似のトランスコードを実行し、実行時間を比較してみました。
トランスコードに特化したハードウェアを活用できる Xilinx Video SDK のパフォーマンスの高さを実感できましたし、もっと高度な処理になればより Xilinx Video SDK の恩恵を受けられるのではと想像します。
以上、AWS 事業本部の大前でした。